package com.hjc;

import com.hjc.entity.Department;
import com.hjc.entity.User;
import org.apache.commons.digester3.Digester;

import java.io.InputStream;

/**
 * @author jc.huang
 * @date 2023/12/21
 */
public class DigesterTest {

    /*
    定义规则解析xml文件
    1.  ObjectCreateRule规则类
        public void addObjectCreate(String pattern, String className, String attributeName) 当匹配到pattern模式节点时会创建对象，当在节点中指定了attributeName属性时，会创建类型为attributeName属性值的对象否则创建类名为className的对象，并将创建的对象push到stack栈顶

    2. SetPropertiesRule规则类
        public void addSetProperties(String pattern)当匹配到pattern模式节点时会填充stack栈顶元素对象的属性值

    3. CallMethodRule规则类
        public void addCallMethod(String pattern, String methodName) （无参）当匹配到pattern模式节点时会调用stack栈顶元素对象的methodName方法
        public void addCallMethod(String pattern, String methodName, int paramCount)（有参，指定参数个数与CallParamRule规则配合使用，设置参数值），构建空的参数数组并push到params栈顶

    4. CallParamRule规则类
        public void addCallParam(String pattern, int paramIndex)  当匹配到pattern模式时，以pattern模式节点的内容填充params栈顶元素参数的值

    5. SetNextRule规则类
        public void addSetNext(String pattern, String methodName, String paramType)  当匹配到pattern模式时，调用栈顶元素的上一个元素的methodName方法并以栈顶元素作为参数

    6. 自定义规则类
        public void addRule(String pattern, Rule rule)当匹配到pattern模式时，执行自定义的规则
     */

    public static void main(String[] args) {
        try (InputStream resource =
                     ClassLoader.getSystemClassLoader().getResourceAsStream("test.xml")) {

            Digester digester = new Digester();
            digester.setValidating(false);

            //创建对象规则
            digester.addObjectCreate("department", Department.class);
            //填充属性规则
            digester.addSetProperties("department");

            digester.addObjectCreate("department/user", User.class.getName());
            digester.addSetProperties("department/user");
            // 调用方法规则
            digester.addCallMethod("department/user", "print");
            // 调用栈顶元素上一个元素的指定方法，以栈顶元素作为参数
            digester.addSetNext("department/user", "addUser", User.class.getName());

            // 解析test.xml文件 获取department对象
            Department department = digester.parse(resource);
            System.out.println(department);

        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}
